import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/storage'
import router from '@/router'

// create an axios instance
const service = axios.create({
  // if u mock don't set this line
  baseURL: process.env.NODE_ENV === 'production' ? '' : '/api', // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  timeout: 5000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent

    if (store.getters.token) {
      config.headers.Authorization = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
   */

  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    const { status } = response
    const res = response.data

    switch (status) {
      case 200:// OK 服务器成功返回用户请求的数据，该操作是幂等的（Idempotent）
        break
      case 201:// CREATED - [POST/PUT/PATCH] 用户新建或修改数据成功
        break
      case 202:// Accepted - [*] 表示一个请求已经进入后台排队（异步任务）
        break
      default:
        break
    }
    return Promise.resolve(res)
  },
  error => {
    // console.log('err:' + JSON.stringify(error.response.status)); // for debug
    let message = ''
    const { status, data } = error.response
    console.error(data.error)
    switch (status) {
      case 400://  INVALID REQUEST - [POST/PUT/PATCH]：用户发出的请求有错误，服务器没有进行新建或修改数据的操作，该操作是幂等的。
        message = status + ':发出的请求有错误' + data.error
        break
      case 401:// Unauthorized - [*]：表示用户没有权限（令牌、用户名、密码错误）。
        message = status + ':未授权请重新登录' + data.error
        store.dispatch('user/logout').then(() => router.push('/login'))

        break
      case 403:// Forbidden - [*] 表示用户得到授权（与401错误相对），但是访问是被禁止的。
        message = status + ':服务器拒绝访问' + data.error
        break
      case 404:// NOT FOUND - [*]：用户发出的请求针对的是不存在的记录，服务器没有进行操作，该操作是幂等的。
        message = status + ':资源未找到' + data.error
        break
      case 406:// Not Acceptable - [GET]：用户请求的格式不可得（比如用户请求JSON格式，但是只有XML格式）。
        message = status + ':请求格式错误' + data.error
        break
      case 410://  Gone -[GET]：用户请求的资源被永久删除，且不会再得到的。
        message = status + ':资源已被永久删除' + data.error
        break
      case 422:// Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时，发生一个验证错误。
        message = status + ':参数验证错误' + data.error
        break
      case 500://  INTERNAL SERVER ERROR - [*]：服务器发生错误，用户将无法判断发出的请求是否成功。
        message = status + ':服务器内部错误' + data.error
        break
      default:
        message = status + ':未知错误'
    }
    Message({
      message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service
